﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Practices.Unity;
using NHibernate;
using NHibernate.Cfg;
using EF.Caching;


namespace Data.Impl
{
    public class SessionManager
    {
        public Configuration NhConfiguration { get; set; }
        public ISessionFactory SessionFactory { get; set; }

        [Dependency]
        public IPerRequestCache PerRequestCache { private get; set; }

        const string NHibernateSessionManagerSessionCacheKey = "NHibernateSessionManagerSessionCacheKey";

        /// <summary>
        /// Utilisé pour les test unitaires
        /// le clear de la session oblige NHibernate à oublié les objets 
        /// précédemment chargés et à requêter à nouveau sur la base
        /// </summary>
        public void ClearSession()
        {
            var session = GetSession();
            session.Clear();
        }

        public ISession GetSession()
        {
            if (PerRequestCache.Contains(NHibernateSessionManagerSessionCacheKey))
                return (ISession)PerRequestCache[NHibernateSessionManagerSessionCacheKey];

            var session = SessionFactory.OpenSession();
            PerRequestCache[NHibernateSessionManagerSessionCacheKey] = session;
            return session;
        }
    }
}
